iT邦幫忙

0

自己做一個 Wayland 桌面環境:LunaDash — 從視窗管理到 Quickshell 的 Linux Desktop

  • 分享至 

  • xImage
  •  

自己做一個 Wayland 桌面環境:LunaDash — 從視窗管理到 Quickshell 的 Linux Desktop

最近我一直在開發一個自己的 Linux 桌面環境:

LunaDash

專案目前仍然處於開發階段,但已經可以作為一個實際的 Wayland Desktop Session 啟動,同時希望有更多開發者能來一起開發維護這個專案。

GitHub:

https://github.com/LuYishan-4/LunaDash

網站:

https://luyishan-4.github.io/LunaDash/

這篇文章想簡單介紹 LunaDash 現在在做什麼、使用哪些技術,以及如果你也對 Wayland、wlroots、Qt、Quickshell 或 Linux Desktop 有興趣,要怎麼實際把它跑起來。


LunaDash 是什麼?

LunaDash 的目標不是單純做一個「好看的 Linux Shell」。

我希望它是一個完整的桌面環境。

也就是從使用者登入 Linux 開始,就能直接進入 LunaDash Session,而不是需要先啟動 KDE、GNOME 或其他桌面,再把 LunaDash 疊在上面。

目前主要希望做到兩件事情:

開箱即用,同時保留足夠高的客製化能力。

對一般使用者來說,登入後應該就已經有:

  • Panel
  • App Launcher
  • Dashboard
  • Notification
  • Settings
  • File tools
  • Screenshot
  • Wallpaper
  • Window management
  • Workspace

而如果想繼續修改,又可以深入到:

  • Quickshell
  • QML
  • Shell Module
  • Window behavior
  • Shortcut
  • Native control interface

也就是說,預設狀態應該可以直接使用,但不希望因為「預設很好用」就把可修改性拿掉。


目前的桌面長什麼樣?

先直接看畫面。

LunaDash Dashboard

外觀設定

LunaDash Appearance Settings

外觀設定目前可以調整桌布、強調色等內容。

LunaDash 本身並不希望把所有 UI 樣式直接寫死。

未來會繼續把更多:

  • 顏色
  • 間距
  • Shell 模組
  • 動畫
  • 快捷鍵
  • 預設應用程式

做成可以修改的設定。


視窗管理

LunaDash Window Management

這也是 LunaDash 和單純 Desktop Shell 最大的不同之一。

目前 LunaDash 自己處理 Wayland compositor 與視窗管理,而不是依賴另一個既有 compositor。

目前正在實作的操作方式包含:

  • 可捲動的視窗欄
  • 視窗分組
  • Floating Window
  • Keyboard-driven navigation
  • Workspace
  • Window animation

因此你可以使用:

Super + H
Super + L

在左右視窗欄之間移動。

再使用:

Super + K
Super + J

選擇同一欄中的其他視窗。

這部分的設計概念比較接近:

不一定要讓每個視窗永遠固定在一個傳統網格中,而是讓一組視窗可以形成可導航、可捲動的工作空間。


Calendar

LunaDash Calendar

Calendar 面板同樣是 Shell 的一部分,也可以使用自訂圖片等方式調整外觀。

上面這些圖片都是 2026/09/20 實際執行 LunaDash 時的桌面截圖,並不是設計稿。


LunaDash 使用了哪些技術?

目前主要使用:

C++20
C11
wlroots
Wayland
OpenGL
Qt 6
Quickshell
QML

簡化成架構的話,大概可以看成:

Linux
  │
  ├─ DRM / KMS
  ├─ libinput
  │
  ▼
wlroots
  │
  ▼
LunaDash Compositor
  │
  ├─ Window Management
  ├─ Input
  ├─ Rendering
  ├─ Workspace
  ├─ Animation
  └─ Wayland Protocol
        │
        ▼
   Quickshell / QML
        │
        ├─ Panel
        ├─ Launcher
        ├─ Dashboard
        ├─ Settings
        └─ Notification

這也是我在做 LunaDash 時覺得非常有趣的地方。

我們平常看到的 Linux Desktop,其實可以拆成很多不同層。

例如:

鍵盤
 ↓
libinput
 ↓
Compositor
 ↓
Wayland surface
 ↓
Application

或者畫面:

Application Buffer
 ↓
Wayland Surface
 ↓
wlroots Scene
 ↓
LunaDash Compositor
 ↓
OpenGL
 ↓
DRM / KMS
 ↓
Monitor

當開始自己寫 compositor 後,很多原本看起來像是「桌面理所當然會做的事情」,其實全部都需要自己處理。

像是:

  • 滑鼠游標
  • 鍵盤輸入
  • Focus
  • 視窗大小
  • 視窗位置
  • Layer Surface
  • Screenshot
  • Clipboard
  • Workspace
  • Animation
  • Output
  • Display configuration

這也是這個專案目前最主要的開發內容。


Shell 為什麼使用 Quickshell?

LunaDash 沒有把所有 UI 都直接寫進 compositor。

Compositor 與桌面 UI 是分開處理的。

底層 compositor 主要使用 C/C++,而桌面 Shell 則大量使用:

Qt 6 + Quickshell + QML

例如:

Panel
Launcher
Dashboard
Notification Center
Settings UI

這些比較適合使用 QML 描述。

這樣做的其中一個好處是:

修改桌面 UI 不需要一直修改 compositor 的 renderer。

例如想調整 Panel:

高度
間距
動畫
按鈕
配色
模組

基本上可以直接從 QML 層處理。

而真正與 Wayland、輸入、視窗和 Render Pipeline 有關的部分,再交給 native compositor。


怎麼安裝 LunaDash?

目前主要開發平台是 Arch Linux

另外安裝腳本也開始處理:

  • Arch Linux
  • Fedora
  • Ubuntu Rolling

不過目前整個專案仍然是開發預覽版,所以如果只是想體驗,建議使用測試環境或至少保留其他 Desktop Session。

取得 dev 分支:

git clone --branch dev https://github.com/LuYishan-4/LunaDash.git
cd LunaDash

接著執行:

./scripts/install-session.sh

安裝器會負責:

  1. 檢查 Linux 發行版
  2. 處理需要的依賴
  3. 編譯 LunaDash
  4. 安裝桌面環境
  5. 建立登入用 Desktop Session

安裝完成後登出。

接著在登入管理員中選擇:

LunaDash(Wayland)

就可以直接進入 LunaDash Desktop。


不想直接安裝也可以先 Dry Run

如果想先知道安裝腳本會做什麼:

./scripts/install-session.sh --dry-run

這樣可以先檢查安裝流程,而不直接修改系統。

Shell 目前需要:

Quickshell 0.3+

如果目前使用的 Linux 發行版沒有提供需要的套件,安裝程式也會顯示缺少哪些依賴。


常用快捷鍵

LunaDash 目前預設的一些操作如下。

快捷鍵 功能
Super + Return 開啟 Terminal
Super + E 開啟檔案工具
Super + D 開啟 Launcher
Super + H / L 聚焦左/右視窗欄
Super + K / J 切換同一欄的視窗
Super + Space Floating Mode
Super + Shift + S 範圍截圖
Super + 1 ~ 9 切換 Workspace

這裡的 Super 就是一般鍵盤上的 Windows / Meta 鍵。

快捷鍵也可以從:

設定 → 鍵盤快捷鍵

修改。


為什麼我要自己做桌面環境?

Linux 上其實已經有非常成熟的 Desktop Environment:

  • KDE Plasma
  • GNOME
  • COSMIC
  • Xfce

Compositor 也已經有:

  • KWin
  • Mutter
  • Hyprland
  • Sway

所以 LunaDash 並不是因為「Linux 沒有桌面可以用」。

反而是因為我想知道:

如果從 compositor 開始自己控制整個桌面,能做到什麼?

以前在 KDE 或其他桌面環境開發時,大部分功能都建立在既有架構上。

例如你想做視窗動畫:

Application
 ↓
Wayland
 ↓
KWin
 ↓
Effect Plugin
 ↓
Render

但自己開始寫 compositor 後,就會變成:

Wayland Client
 ↓
LunaDash
 ↓
wlr_surface
 ↓
wlr_scene
 ↓
Animation state
 ↓
OpenGL
 ↓
Output

連「視窗淡出」這種表面上很簡單的功能,都必須知道:

  • Buffer 在哪裡
  • Scene Node 在哪裡
  • opacity 要在哪一層改
  • Damage 怎麼更新
  • Frame 什麼時候重新 Render

所以 LunaDash 對我來說不只是 Desktop Environment,也是一個實際研究:

Wayland
Compositor
Rendering
Linux Input
Desktop Shell

如何串在一起的專案。


專案目前還在開發中

目前 LunaDash 還不是一個成熟的 Stable Desktop Environment。

GitHub 上目前也明確標示為:

Development Preview

目前還有很多東西持續在調整,例如:

  • 應用程式相容性
  • Input
  • Window Animation
  • Screenshot
  • Desktop stability
  • Multi-monitor
  • Shell integration
  • Settings
  • Default applications
  • Packaging

所以現階段比較適合:

  • 想研究 Wayland 的人
  • 想研究 wlroots 的人
  • 對 compositor 有興趣的人
  • 喜歡 Linux Desktop 客製化的人
  • 想研究 Qt / QML / Quickshell 的人

一起測試。


如果你也對 Linux Desktop 有興趣

LunaDash 是 GPL-3.0-only 的開源專案。

專案:

https://github.com/LuYishan-4/LunaDash

網站:

https://luyishan-4.github.io/LunaDash/

目前歡迎:

  • Issue
  • Bug Report
  • UI / UX 建議
  • Documentation
  • Pull Request
  • Wayland / wlroots 相關建議

Pull Request 目前以:

dev

作為主要開發分支。


接下來

之後如果有時間,我也想把 LunaDash 裡比較底層的東西分開寫成文章。

例如:

Wayland 到底怎麼把畫面送到螢幕?
wlroots 的 wlr_scene 在做什麼?
Wayland compositor 怎麼收到鍵盤輸入?
為什麼 compositor 可以控制視窗?
視窗動畫到底是在動畫什麼?
截圖工具 grim 是怎麼和 compositor 溝通?
Quickshell 和 compositor 又是怎麼分工的?

因為實際自己寫了一次之後,會發現 Wayland 並沒有想像中那麼神秘。

它其實就是很多不同層的元件,一層一層把:

Input
Window
Buffer
Scene
Render
Output

串起來。

而 LunaDash 現在做的事情,就是試著把這整條 Desktop Stack 自己接起來。

如果你也對 Linux、Wayland、wlroots 或 Desktop Environment 開發有興趣,歡迎來 GitHub 看看。

LunaDash 還很早期,但也正因為還很早期,現在幾乎每一個部分都還有可以玩的東西,未來預計完善整個桌面環境和開發插件系統。


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言